/**
 * 
 */
package com.zhiteng.controller;

import java.io.UnsupportedEncodingException;
import java.util.List;

import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.zhiteng.entity.Manager;
import com.zhiteng.entity.School;
import com.zhiteng.entity.Teacher;
import com.zhiteng.service.ManagerService;
import com.zhiteng.service.RedisService;
import com.zhiteng.service.SchoolService;
import com.zhiteng.service.TeacherService;
import com.zhiteng.utils.common.JuHeMsgUtil;
import com.zhiteng.utils.common.RegexUtil;
import com.zhiteng.utils.common.ZTResult;

/**  
* <p>Title: UserController.java</p>  
* <p>Description: </p>  
* @author dragon  
* @date 2018年11月9日  
* @version 1.0  
*/
@Controller
@RequestMapping("/manager")
public class ManagerController {
	@Autowired
	private ManagerService managerService;
	@Autowired
	private RedisService redisService;
	@Autowired
	private TeacherService teacherService;
	@Autowired
	private SchoolService schoolService;
	
	/**
	 * 
	* @Title: addManager  
	* @Description: 添加管理员账号(需要手机号和用户名， 没有用户名则用手机号作为用户名) 
	* @param telephone 手机号
	* @param managerName 账户名（可选，不传的话默认账户名为腾讯智慧校园中的教师姓名）
	* @return ZTResult<Void>   
	* @throws
	 */
	@RequestMapping("/addManager")
	@ResponseBody
	public ZTResult<Void> addManager(Manager manager){
		
		if(StringUtils.isBlank(manager.getTelephone())) {
			return ZTResult.result(1,"添加失败，请填写手机号！");
		}
		
		//	1、手机号码格式校验
		if(!RegexUtil.isTelephone(manager.getTelephone())) {	
			return ZTResult.result(1, "手机号格式不正确");
		}
		
		//	2、验证该管理员手机号是否已经注册
		Manager m = managerService.queryManager(manager);
		if(m!=null) {
			return ZTResult.result(1, "该管理员已经注册");
		}
		
		//	3、验证腾讯数据中是否已存在该手机号
		List<Teacher> teacherList = teacherService.queryTeacherByTelephone(manager.getTelephone());
		if(teacherList==null || teacherList.isEmpty()) {
			return ZTResult.result(1, "添加失败，该手机号未在腾讯智慧校园注册");
		}
		Teacher teacher = teacherList.get(0);	//	内测人员可能一个手机号对应多个学校
		manager.setId(teacher.getUserid());
		manager.setSchoolName(teacher.getSchool_name());
		manager.setHead(teacher.getHead());
		School school = schoolService.querySchoolBySchoolName(teacher.getSchool_name());
		if(school!=null) manager.setSchoolId(school.getObjectid());;
		
		//	没有用户名则用手机号作为用户名
		if(StringUtils.isBlank(manager.getManagerName())) {
			manager.setManagerName(teacher.getName());
		}
		
		//	将管理员存入数据库
		managerService.saveManager(manager);
		
		return ZTResult.result(0, "添加成功");
	}
	
	/**
	 * 
	* @Title: getMsgCheckCode  
	* @Description: 获取登录时用的短信验证码 
	* @return ZTResult<Void>   
	* @throws
	 */
	@RequestMapping("/getMsgCheckCode")
	@ResponseBody
	public ZTResult<Void> getMsgCheckCode(Manager manager){
		//	手机号码格式校验
		if(!RegexUtil.isTelephone(manager.getTelephone())) {	//	不通过
			return ZTResult.result(1, "手机号格式不正确");
		}
		
		//	手机号对应的管理员是否存在
		manager = managerService.queryManager(manager);
		if(manager!=null) {	//	存在
			//	生成4位随机数字作为验证码
			String checkCode = RandomStringUtils.randomNumeric(4);
				try {
					//	发送验证码
					JuHeMsgUtil.sendMsg(manager.getTelephone(), checkCode);
					//	将验证码保存到redis中，并设置过期时间180s(哈希存储更合理，验证码和管理员绑定)
					//	180s内多次发送验证码后面的会将前面覆盖掉
					redisService.hset(manager.getTelephone(),"checkCode", checkCode, 180);
					return ZTResult.result(0, "发送成功");
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
					return ZTResult.result(1, "发送失败");
				}
		}else {	//	不存在
			return ZTResult.result(1,"该管理员不存在");
		}
		
	}
	
	/**
	 * 
	* @Title: login  
	* @Description: 登录后台管理系统（通过手机号和验证码登录）
	* @param telephone 手机号
	* @param checkCode 验证码
	* @return ZTResult<Void>   
	* @throws
	 */
	@RequestMapping("/login")
	@ResponseBody
	public ZTResult<Object> login(Manager manager,HttpSession session,
			@RequestParam(name="checkCode")String checkCode){
		//	手机号码格式校验
		if(!RegexUtil.isTelephone(manager.getTelephone())) {	//	不通过
			return ZTResult.result(1, "手机号格式不正确");
		}

		//	判断手机号和验证码
		String value = redisService.hget(manager.getTelephone(),"checkCode");
		if(value!=null && checkCode.equals(value)) {	//	手机号和验证码都正确，成功登录
			manager = managerService.queryManager(manager);
			//	将管理员信息保存到session中
			session.setAttribute("manager", manager);
			//	登录成功则将redis中的验证码销毁，从而保证验证码是一次性的
			redisService.del(manager.getTelephone());
			
			return ZTResult.result(0, "登录成功",manager);
		}else {
			return ZTResult.result(1, "手机号或验证码错误");
		}
	}
	
	/**
	 * 
	* @Title: deleteManagerBatch  
	* @Description: 批量删除管理员账号
	* @param ids 管理员id数组
	* @return ZTResult<Void>   
	* @throws
	 */
	@RequestMapping("/deleteManagerBatch")
	@ResponseBody
	public ZTResult<Void> deleteManagerBatch(@RequestParam(name="ids")String[] ids){
		int count = managerService.deleteManagerBatch(ids);
		if(count==ids.length) {
			return ZTResult.result(0, "删除成功");
		}else if(count==0){
			return ZTResult.result(1, "删除失败");
		}else {
			return ZTResult.result(1, "成功删除"+count+"个管理员，"+(ids.length-count)+"个删除失败");
		}
	}
	
	/**
	 * 
	* @Title: queryAllManager  
	* @Description: 根据学校id查询所有管理员信息 
	* @param schoolId
	* @return ZTResult<Object>   
	* @throws
	 */
	@RequestMapping("/queryAllManager")
	@ResponseBody
	public ZTResult<Object> queryAllManager(@RequestParam(name="schoolId")String schoolId){
		if(StringUtils.isBlank(schoolId)) {
			return ZTResult.result(1,"查询失败，请检查参数");
		}
		List<Manager> managerList = managerService.queryAllManagerBySchoolId(schoolId);
		return ZTResult.result(0,"查询成功",managerList);
	}
}







